
//#include	"header.h"
#include	"EEPROM.h"

/**********************************************
 * 关闭IAP功能
 **********************************************/
//========================================================================
// 函数: void EEPROM_Trig(void)
// 描述: 触发EEPROM操作.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2014-6-30
//========================================================================
void EEPROM_Trig(void)
{
		EA = 0;     //禁止中断, 避免触发命令无效
		IAP_TRIG = 0x5A; //写触发命令(0x5a)
		IAP_TRIG = 0xA5; //写触发命令(0xa5)
		_nop_(); //
		_nop_(); //
		EA = 1;     //恢复全局中断
}
		
		

/**********************************************
 * 关闭IAP功能
 **********************************************/
void IAP_Disable() {
    //IAP_CONTR = 0x00;    // 关闭IAP
    //IAP_CMD   = 0x00;    // 清除命令
    //IAP_TRIG  = 0x00;    // 清除触发
		IAP_CONTR = 0; //关闭 IAP 功能
		IAP_CMD = 0; //清除命令寄存器
		IAP_TRIG = 0; //清除触发寄存器
		IAP_ADDRH = 0xff; //将地址设置到非 IAP 区域
		IAP_ADDRL = 0xff; 
}

/**********************************************
 * 等待IAP操作完成（检测ISP_CONTR.7）
 **********************************************/
/*void IAP_Wait() 
{
    while (IAP_CONTR & 0x80); // 等待操作完成（bit7=0时完成）
}
*/
/**********************************************
 * 从EEPROM读取一个字节
 * addr: 目标地址（范围需在芯片EEPROM地址内）
 **********************************************/
unsigned char IAP_ReadByte(unsigned int addr) 
{
    unsigned char dat;

/*    IAP_CONTR = ENABLE_IAP | IAP_WAIT_TIME;  // 使能IAP，配置等待时间
    IAP_CMD = CMD_READ;                      // 设置读命令
    IAP_ADDRH = (unsigned char)(addr >> 8);  // 地址高字节
    IAP_ADDRL = (unsigned char)(addr & 0xFF); // 地址低字节
    IAP_Trigger();                           // 触发操作
   	IAP_Wait();                              // 等待完成
    dat = ISP_DATA;                          // 读取数据
    IAP_Disable();                           // 关闭IAP
    return dat;
*/	
		IAP_CONTR = 0x80; //使能 IAP
		IAP_TPS = 12; //设置擦除等待参数 12MHz
		IAP_CMD = 1; //设置 IAP 读命令
		IAP_ADDRL = addr % 256; //设置 IAP 低地址
		IAP_ADDRH = addr / 256; //设置 IAP 高地址
		EEPROM_Trig();	// 触发EEPROM操作
		dat = IAP_DATA; //读 IAP 数据
		IAP_Disable(); 
		return dat;
}

/**********************************************
 * 向EEPROM写入一个字节
 * addr: 目标地址
 * dat:  待写入数据（需先擦除扇区）
 **********************************************/
void IAP_ProgramByte(unsigned int addr, unsigned char dat) 
{
/*    
		IAP_CONTR = ENABLE_IAP | IAP_WAIT_TIME;  // 使能IAP
    IAP_CMD = CMD_PROGRAM;                   // 设置写命令
    IAP_ADDRH = (unsigned char)(addr >> 8);
    IAP_ADDRL = (unsigned char)(addr & 0xFF);
    ISP_DATA = dat;                          // 写入数据
    IAP_Trigger();                           // 触发操作
    IAP_Wait();                              // 等待完成
    IAP_Disable();                           // 关闭IA
*/
		IAP_CONTR = 0x80; //使能 IAP
		IAP_TPS = 12; //设置擦除等待参数 12MHz
		IAP_CMD = 0x02; //设置 IAP 写命令
		IAP_ADDRL = addr % 256; //设置 IAP 低地址
		IAP_ADDRH = addr / 256; //设置 IAP 高地址
		IAP_DATA = dat; //写 IAP 数据
		EEPROM_Trig();	// 触发EEPROM操作
		IAP_Disable();
	
}

/**********************************************
 * 擦除整个扇区（扇区大小为512字节）
 * addr: 扇区内任意地址
 **********************************************/
void IAP_EraseSector(unsigned int addr) 
{
    
/*		IAP_CONTR = ENABLE_IAP | IAP_WAIT_TIME;  // 使能IAP
    IAP_CMD = CMD_ERASE;                     // 设置擦除命令
    IAP_ADDRH = (unsigned char)(addr >> 8);
    IAP_ADDRL = (unsigned char)(addr & 0xFF);
    IAP_Trigger();                           // 触发操作
    IAP_Wait();                              // 等待完成
    IAP_Disable();                           // 关闭IAP
*/	
		IAP_CONTR = 0x80; //使能 IAP
		IAP_TPS = 12; //设置擦除等待参数 12MHz
		IAP_CMD = 3; //设置 IAP 擦除命令
		IAP_ADDRL = addr % 256; //设置 IAP 低地址
		IAP_ADDRH = addr / 256; //设置 IAP 高地址
		EEPROM_Trig();	// 触发EEPROM操作
		IAP_Disable(); //关闭 IAP 功能
}

/*==================================================================
//********	程序名称：read_eeprom()
//********	程序功能：读取EEPROM中的值
//********	入口参数：
//********	出口参数：值直接送变量
//********	编写者：ji				日期：2010-10-12
==================================================================*/
void read_eeprom()
{
	
	switch_1 = IAP_ReadByte(eep_switch_1); 	// 读 开关量


}

/*==================================================================
//********	程序名称：write_eeprom()
//********	程序功能：写入EEPROM中的值
//********	入口参数：
//********	出口参数：值直接送变量
//********	编写者：ji				日期：2010-10-12
==================================================================*/
void write_eeprom()
{
  	IAP_EraseSector(0x0000);	//擦除EEPROM 每个扇区占512字节

	IAP_ProgramByte(eep_switch_1, switch_1); // 写 设备地址

}


/**********************************************
 * 测试EEPROM读写（主函数示例）
 **********************************************/
/*void main() {
    unsigned char read_data;
    unsigned int target_addr = 0x0400;  // EEPROM地址（需在有效范围内）

    // 操作前建议关闭中断
    EA = 0;

    // 1. 擦除扇区（必须！）
    IAP_EraseSector(target_addr);

    // 2. 写入数据0xAA
    IAP_ProgramByte(target_addr, 0xAA);

    // 3. 读取验证
    read_data = IAP_ReadByte(target_addr);

    // 4. 处理结果（例如通过串口输出）
    if (read_data == 0xAA) {
        // 成功：点亮LED或发送成功信号
    } else {
        // 失败：错误处理
    }

    // 恢复中断
    EA = 1;

    while (1);  // 主循环
}
*/











